#include "drv_exti.h"
void drv_extif9_init(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;//用于配置 GPIO 引脚的模式（输入 / 输出等）
	EXTI_InitTypeDef EXTI_InitStruct;//用于配置外部中断触发方式、使能等
	NVIC_InitTypeDef NVIC_InitStruct;//用于配置中断优先级、中断使能（嵌套向量中断控制器）

	//GPIO初始化
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);//开启GPIOF时钟
	RCC_APB2PeriphClockCmd(RCC_APB2ENR_SYSCFGEN,ENABLE);//开启syscfg时钟
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;//设为输入模式
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;//具体对应的物理引脚
	GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;//设为上拉电阻使能
	GPIO_Init(GPIOF,&GPIO_InitStruct);

	//绑定GPIO与引脚线
	SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOF,EXTI_PinSource9);

	//EXTI初始化
	EXTI_InitStruct.EXTI_Line = EXTI_Line9;//指定中断线为9
	EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;//设置为中断模式
	EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;//设为上升沿触发
	EXTI_InitStruct.EXTI_LineCmd = ENABLE;//使能该中断线
	EXTI_Init(&EXTI_InitStruct);

	//NVIC初始化
	NVIC_InitStruct.NVIC_IRQChannel = EXTI9_5_IRQn;//指定中断通道
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;//抢占优先级（数值越小，优先级越高）
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;//响应优先级（抢占优先级相同时，数值越小，优先级越高）
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//使能该中断通道
	NVIC_Init(&NVIC_InitStruct);
}


void drv_extic_init(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;//用于配置 GPIO 引脚的模式（输入 / 输出等）

	//GPIO初始化
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);//开启GPIOF时钟
	RCC_APB2PeriphClockCmd(RCC_APB2ENR_SYSCFGEN,ENABLE);//开启syscfg时钟
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;//设为输入模式
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;//具体对应的物理引脚
	GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;//设为上拉电阻使能
	GPIO_Init(GPIOC,&GPIO_InitStruct);
}

// 轮询检测 GPIOC9 按键（带消抖）
uint8_t drv_key_c9_poll(void)
{
    static uint8_t key_state = 1;  // 记录按键状态（1：未按下，0：按下）
    uint8_t current_state = GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_9);

    // 消抖逻辑：连续检测到状态变化才确认
    if (current_state != key_state)
    {
        drv_systick_ms(20);  // 消抖延时
        if (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_9) == current_state)
        {
            key_state = current_state;
            if (current_state == 0)  // 按键按下（高→低）
            {
                return 1;  // 检测到一次按下
            }
        }
    }
    return 0;
}



